package com.ganmiao.utils;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * jwt操作工具类
 */
public class JwtUtils {

    //签名
    public static final String SING = "!Q@W3e4r%T^";

    //token签发者
    public static final String ISSUSRE = "GANMIAO";

    //过期时间(15天)
    public static final long EXPIRE = 1000 * 60 * 60 * 24 * 15;

    /**
     * 生成token字符串
     *
     * @param id
     * @return
     */
    public static String getJwtToken(Integer id) {
        return Jwts.builder()
                //JWT头信息
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS2256")
                //设置分类；设置过期时间 一个当前时间，一个加上设置的过期时间常量
                .setSubject(ISSUSRE)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                //设置token主体信息，存储用户信息
                .claim("id", id)
                //.signWith(SignatureAlgorithm.ES256, SING)
                .signWith(SignatureAlgorithm.HS256, SING)
                .compact();
    }

    public static String getJwtTokenV2(String id) {
        return Jwts.builder()
                //JWT头信息
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS2256")
                //设置分类；设置过期时间 一个当前时间，一个加上设置的过期时间常量
                .setSubject(ISSUSRE)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                //设置token主体信息，存储用户信息
                .claim("id", id)
                //.signWith(SignatureAlgorithm.ES256, SING)
                .signWith(SignatureAlgorithm.HS256, SING)
                .compact();
    }

    /**
     * 判断token是否存在与有效
     *
     * @Param jwtToken
     */
    public static boolean checkToken(String jwtToken) {
        if (StringUtils.isEmpty(jwtToken)) {
            return false;
        }
        try {
            //验证token
            Jwts.parser().setSigningKey(SING).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 判断token是否存在与有效
     *
     * @Param request
     */
    public static boolean checkToken(HttpServletRequest request) {
        try {
            String token = request.getHeader("token");
            if (StringUtils.isEmpty(token)) {
                return false;
            }
            Jwts.parser().setSigningKey(SING).parseClaimsJws(token);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

}
